package cn.tedu.mall.front.service.impl;

import cn.tedu.mall.front.mapper.FrontCategoryMapper;
import cn.tedu.mall.front.service.IFrontCategoryService;
import cn.tedu.mall.pojo.front.entity.FrontCategoryEntity;
import cn.tedu.mall.pojo.front.vo.FrontCategoryTreeVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class FrontCategoryServiceImpl implements IFrontCategoryService {
    // 直接注入FrontCategoryMapper 接口

    @Autowired
    private FrontCategoryMapper frontCategoryMapper;

    /**
     * 第一步：查询frontCategoryMapper所有分类
     * 第二部：解析封装结果
     * 第三部：
     * @return
     */
    @Override
    public FrontCategoryTreeVO categoryTree() {
        // 这个方法通过映射文件xml来解决属性和字段不一致的问题，手动映射Map标签
        List<FrontCategoryEntity> frontCategoryEntityList = frontCategoryMapper.selectAll();
        // 初始化解析
        FrontCategoryTreeVO frontCategoryTreeVO = initTree(frontCategoryEntityList);
        // 返回
        return frontCategoryTreeVO;
    }

    private FrontCategoryTreeVO initTree(List<FrontCategoryEntity> frontCategoryEntityList) {
        /**
         * 参数是包含所有分类的数组集合，使用一个Map对象，key值是分类的id，value是list集合，
         * 如果这个id对应的分类是父级分类，value就是子集集合
         */
        // 准备一个Map对象
        Map<Long, List<FrontCategoryEntity>> categoriesMap = new HashMap<>();
        log.debug("当前拿到分类个数：{}", frontCategoryEntityList.size());
        // 对查询的全量分类做遍历，按照key值是id，value是id下的下级分类集合
        for (FrontCategoryEntity frontCategoryEntity : frontCategoryEntityList) {
            Long parentId = frontCategoryEntity.getParentId();
            // 对map是否有这个key值进行判断，有，直接将元素添加到value中，如果没有，则构建初始化数据
            if (!categoriesMap.containsKey(parentId)) {
                List<FrontCategoryEntity> nextLevelList = new ArrayList<>();
                nextLevelList.add(frontCategoryEntity);
                categoriesMap.put(parentId, nextLevelList);
            } else {
                List<FrontCategoryEntity> nextLevelList = categoriesMap.get(parentId);
                nextLevelList.add(frontCategoryEntity);
            }
        }
        // 当前map中保存了所有同一父级分类的子集集合，但是不能区分几级
        // 一级分类key=0，根据一级分类集合遍历找到二级分类，嵌套遍历二级分类找到三级分类
        // 准备返回对象
        FrontCategoryTreeVO frontCategoryTreeVO = new FrontCategoryTreeVO();
        // 拿到一级分类
        List<FrontCategoryEntity> firstLevelCategories = categoriesMap.get(0L);
        frontCategoryTreeVO.setCategories(firstLevelCategories);
        // 遍历一级分类，封装二级分类的list集合
        for (FrontCategoryEntity fiestLevelCategory : firstLevelCategories) {
            Long firstLevelId = fiestLevelCategory.getId();
            // 到map取出这个id对应的下级分类集合
            List<FrontCategoryEntity> secondLevelCategories = categoriesMap.get(firstLevelId);
            // set回每个一级分类的对象
            fiestLevelCategory.setChildrens(secondLevelCategories);
            // 循环遍历二级分类，封装三级分类list集合
            for (FrontCategoryEntity secondLevelCategory : secondLevelCategories) {
                // 拿到每一个二级分类的id
                Long secondLevelId = secondLevelCategory.getId();
                // 到map取出这个二级id对应的三级集合
                List<FrontCategoryEntity> thirdLevelCategories = categoriesMap.get(secondLevelId);
                // set到当前二级分类对象汇总
                secondLevelCategory.setChildrens(thirdLevelCategories);
            }
        }

        return frontCategoryTreeVO;
    }
}
